#include <iostream>
#include "SingleLinkList.h"
 
//默认构造函数
template <typename T>
SingleLink<T>::SingleLink():count(0),phead(NULL)
{
    phead = new Node<T>();
    phead->_next = NULL;
};

//获取表头元素
template <typename T>
Node<T>* SingleLink<T>::getHead()
{
    return phead->_next;
};

//返回指定索引的前一个位置节点，若链表为空，则返回头节点
template <typename T>
Node<T>* SingleLink<T>::getNode(int index)
{
    if(index > count||index < 0) return NULL;
    int temp = 0;
    Node<T>* preNode = phead;
    while(temp < index){
        temp++;
        preNode = preNode->_next;
    }
    return preNode;
};

//析构函数
template <typename T>
SingleLink<T>::~SingleLink()
{
    Node<T>* pNode = phead->_next;
    while(pNode != NULL){
        Node<T>* temp = pNode;
        pNode = pNode->_next;
        delete temp;
    }
};
//返回链表大小
template <typename T>
int SingleLink<T>::size()
{
    return count;
};

//链表判空
template <typename T>
bool SingleLink<T>::isEmpty()
{
    return count == 0;
};

//在指定位置插入新节点
template <typename T>
Node<T>* SingleLink<T>::insert(int index,T t)
{
    Node<T>* preNode = getNode(index);
    if(preNode){
        Node<T>* newNode = new Node<T>(t,preNode->_next);
        preNode->_next = newNode;
        count++;
        return newNode;
    }
    return NULL;
};

//头部插入
template <typename T>
Node<T>* SingleLink<T>::insert_head(T t)
{
    return insert(0,t);
};

//尾部插入
template <typename T>
Node<T>* SingleLink<T>::insert_last(T t)
{
    insert(count,t);
};
 
//删除指定位置的元素
template <typename T>
Node<T>* SingleLink<T>::del(int index)
{
    if(isEmpty()) return NULL;
    Node<T>* ptrNode = getNode(index);
    Node<T>* delNode = ptrNode->_next;
    ptrNode->_next = delNode->_next;
    count--;
    delete delNode;
    return  ptrNode->_next;
};

//删除头节点
template <typename T>
Node<T>* SingleLink<T>::delete_head()
{
    return del(0);
};

//删除尾节点
template <typename T>
Node<T>* SingleLink<T>::delete_last()
{
    return del(count);
};
 
 







